/* 泛型算法 = template + 迭代器 + 函数对象
 * sort、find、find_if、binary_search、for_each
 *
 * 特点一：泛型算法的参数接收的都是迭代器
 * 特点二：泛型算法的参数还可以接收函数对象(C函数指针)
 *
 * 绑定器+二元函数对象  =》一元函数对象
 * bind1st: 把二元函数对象的operator()的第一个形参绑定起来
 * bind2nd: 把二元函数对象的operator()的第二个形参绑定起来
 *
 * */
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
    vector<int> vec;
    for (int i = 0; i < 10; ++i) {
       vec.push_back(rand()%10+1);
    }
    for(int v:vec){
        cout<<v<<" ";
    }
    cout<<endl;
    sort(vec.begin(),vec.end());

    for (int v:vec) {
        cout<<v<<" ";
    }
    cout<<endl;

    if (binary_search(vec.begin(),vec.end(),2)){
        cout<<"binary_search exists"<<endl;
    }

    auto it1= find(vec.begin(),vec.end(),2);
    if (it1!=vec.end()){
        cout<<"find 2 exits"<<endl;
    }
    //传入函数对象greater，改变容器元素时的比较方式
    sort(vec.begin(),vec.end(),greater<int>());
    for (int v:vec) {
        cout<<v<<" ";
    }
    cout<<endl;

    //10 9 9 8 5 5 5 3 2 1
    //把7按顺序插入到vector容器当中  找第一个小于7的数
    // find_if需要是一个一元函数对象
    auto it2= find_if(vec.begin(),vec.end(),binder1st(greater<int>(),7));
    vec.insert(it2,7);
    for (int v:vec) {
        cout<<v<<" ";
    }
    cout<<endl;

    auto it3= find_if(vec.begin(),vec.end(),[](int val){
        return val<6;
    });
    vec.insert(it3,6);
    for (int v:vec) {
        cout<<v<<" ";
    }
    cout<<endl;

    //for_each可以遍历容器的所有元素，可以自行添加合适的函数对象对容器元素进行过滤
    for_each(vec.begin(),vec.end(),[](int val){
        if (val%2==0){
            cout<<val<<"";
        }
    });
    return 0;
}